// API 集中管理文件

// 配置信息
const config = {
	baseUrl: 'http://localhost:8848', // 基础URL，根据实际部署环境修改
	timeout: 60000, // 请求超时时间，单位毫秒
	headers: {
		'Content-Type': 'application/json'
	}
};

/**
 * 请求封装函数
 * @param {Object} options 请求配置
 * @returns {Promise} 请求结果
 */
function request(options) {
	return new Promise((resolve, reject) => {
		// 合并请求头
		const header = Object.assign({}, config.headers, options.header || {});
		
		// 完整请求URL
		const url = options.url.startsWith('http') 
					? options.url 
					: config.baseUrl + options.url;
		
		// 请求配置
		const requestOptions = {
			url: url,
			data: options.data,
			method: options.method || 'GET',
			header: header,
			timeout: options.timeout || config.timeout,
			dataType: options.dataType || 'json',
			responseType: options.responseType || 'text',
			success: (res) => {
				if (res.statusCode >= 200 && res.statusCode < 300) {
					resolve(res.data);
				} else {
					reject({
						statusCode: res.statusCode,
						message: res.data.message || '请求失败',
						data: res.data
					});
				}
			},
			fail: (err) => {
				reject({
					statusCode: err.statusCode || -1,
					message: err.errMsg || '网络请求失败',
					data: null
				});
			}
		};
		
		// 发送请求
		uni.request(requestOptions);
	});
}

/**
 * AI 聊天功能
 * @param {String} message 用户消息
 * @param {String} [systemPrompt] 系统提示（可选）
 * @returns {Promise} 返回AI回复
 */
export function askAI(message, systemPrompt) {
	// 请求数据
	const data = {
		question: message,
		model: 'doubao-1-5-thinking-pro-250415'
	};
	
	// 如果有系统提示，则添加
	if (systemPrompt) {
		data.systemPrompt = systemPrompt;
	}
	
	// 发送请求
	return request({
		url: '/api/doubao/chat',
		method: 'POST',
		data: data
	}).then(res => {
		// 处理返回数据
		if (res && res.data && res.data.choices && res.data.choices.length > 0) {
			return res.data.choices[0].message.content;
		} else {
			throw new Error('AI回答解析失败');
		}
	});
}

/**
 * 图文混合 AI 聊天功能
 * @param {String} message 用户消息
 * @param {File} image 图片文件
 * @param {String} [systemPrompt] 系统提示（可选）
 * @returns {Promise} 返回AI回复
 */
export function askAIWithImage(message, image, systemPrompt) {
	// 创建 FormData 对象
	const formData = new FormData();
	formData.append('question', message);
	formData.append('image', image);
	
	// 如果有系统提示，则添加
	if (systemPrompt) {
		formData.append('systemPrompt', systemPrompt);
	}
	
	// 添加模型信息
	formData.append('model', 'doubao-1-5-thinking-pro-250415');
	
	// 发送请求
	return new Promise((resolve, reject) => {
		uni.uploadFile({
			url: config.baseUrl + '/api/doubao/chat-with-image',
			files: [{ name: 'image', file: image }],
			formData: {
				question: message,
				systemPrompt: systemPrompt || '',
				model: 'doubao-1-5-thinking-pro-250415'
			},
			success: (res) => {
				if (res.statusCode >= 200 && res.statusCode < 300) {
					try {
						const data = JSON.parse(res.data);
						if (data && data.data && data.data.choices && data.data.choices.length > 0) {
							resolve(data.data.choices[0].message.content);
						} else {
							reject(new Error('AI回答解析失败'));
						}
					} catch (e) {
						reject(new Error('响应解析失败'));
					}
				} else {
					reject({
						statusCode: res.statusCode,
						message: '请求失败'
					});
				}
			},
			fail: (err) => {
				reject({
					message: err.errMsg || '网络请求失败'
				});
			}
		});
	});
}

/**
 * 智能搜题功能（文本搜题）
 * @param {String} question 题目文本
 * @returns {Promise} 返回搜题结果
 */
export function searchQuestion(question) {
	// 系统提示，为搜题功能优化
	const systemPrompt = `
	你是一个专业的题目解答助手，擅长解答学生的学习问题。
	请分析学生提供的题目，给出详细的解题思路和步骤，最后得出准确答案。
	如果题目提供信息不足，请基于合理推断给出最可能的解法。
	请按以下格式组织你的回答：
	1. 首先识别题目类型和核心知识点
	2. 解题思路和关键步骤
	3. 列出计算过程（如适用）
	4. 明确标注最终答案
	`;
	
	return askAI(question, systemPrompt);
}

/**
 * 智能搜题功能（图片搜题）
 * @param {File} image 题目图片
 * @returns {Promise} 返回搜题结果
 */
export function searchQuestionWithImage(image) {
	// 系统提示，为图片搜题功能优化
	const systemPrompt = `
	你是一个专业的题目解答助手，擅长解答学生的学习问题。
	请先识别图片中的题目内容，然后给出详细的解题思路和步骤，最后得出准确答案。
	如果图片中的题目信息不足或模糊，请说明情况并基于可见内容给出可能的解法。
	请按以下格式组织你的回答：
	1. 首先写出识别到的题目内容
	2. 确定题目类型和核心知识点
	3. 解题思路和关键步骤
	4. 列出计算过程（如适用）
	5. 明确标注最终答案
	`;
	
	return askAIWithImage("请识别并解答图片中的题目", image, systemPrompt);
} 